package com.example.utils;

import org.springframework.stereotype.Component;

import java.security.Key;
import io.jsonwebtoken.*;
import io.jsonwebtoken.security.Keys;

import java.util.Date;
import java.util.HashMap;


@Component
public class JwtUtils {

    // 固定密钥：至少 32 字节（256 位），示例使用 Base64 编码的 32 字节密钥
    private static final String SECRET_KEY_BASE64 = "LX2lnm1cyaHUuPHWxb02Txzl5yTx2lqfRthIFrHO+zQ="; // 32字节
    private static final Key SECRET_KEY = Keys.hmacShaKeyFor(SECRET_KEY_BASE64.getBytes(java.nio.charset.StandardCharsets.UTF_8));

    // 固定过期时间：24 小时（毫秒）
    private static final long EXPIRATION_MS = 24 * 60 * 60 * 1000L;

    private JwtUtils() {
        // 工具类，禁止实例化
    }

    /**
     * 将用户ID生成为 JWT 字符串
     *
     * @param userId 用户唯一标识（不可为 null 或空白）
     * @return JWT 字符串
     */
    public static String userIdToJwt(String userId) {
        if (userId == null || userId.isBlank()) {
            throw new IllegalArgumentException("userId 不能为空");
        }
        Date now = new Date();
        Date exp = new Date(now.getTime() + EXPIRATION_MS);

        return Jwts.builder()
                .setClaims(new HashMap<>()) // 可在此添加自定义声明
                .setSubject(userId)           // 主题通常为用户唯一标识
                .setIssuedAt(now)
                .setExpiration(exp)
                .signWith(SECRET_KEY, SignatureAlgorithm.HS256)
                .compact();
    }

    /**
     * 将 JWT 解析为 userId
     *
     * @param token JWT 字符串
     * @return userId
     * @throws IllegalArgumentException 当 token 无效、过期或解析失败时抛出
     */
    public static String jwtToUserId(String token) {
        if (token == null || token.isBlank()) {
            throw new IllegalArgumentException("token 不能为空");
        }
        Claims claims = Jwts.parserBuilder()
                .setSigningKey(SECRET_KEY)
                .build()
                .parseClaimsJws(token)
                .getBody();
        return claims.getSubject();
    }
}
